home *** CD-ROM | disk | FTP | other *** search
/ Aminet 28 / Aminet 28 (1998)(GTI - Schatztruhe)[!][Dec 1998].iso / Aminet / dev / c / qtools0.2-src.lha / src / libqdisplay / draw-opti24.c < prev    next >
Encoding:
C/C++ Source or Header  |  1998-08-11  |  4.5 KB  |  179 lines

  1. #ifdef    USE_ZBUFFER
  2. #define    inc()        { u += du; v += dv; w += dw; }
  3. #define    fill(pel, z) { *pBuffer++ = (pel); *zBuffer++ = (unsigned short int)(z); }
  4. #else
  5. #define    inc()        { u += du; v += dv; }
  6. #define    fill(pel, z) { *pBuffer++ = (pel); }
  7. #endif
  8.  
  9. #ifdef    USE_ZBUFFER
  10. struct rgb *draw_affine24(int n, struct rgb *pBuffer, unsigned short int *zBuffer, int u, int v, int w, int du, int dv, int dw)
  11. #else
  12. struct rgb *draw_affine24(int n, struct rgb *pBuffer, int u, int v, int du, int dv)
  13. #endif
  14. {
  15.   if (textureType == WALL_TYPE) {
  16.     while (n--) {
  17.       int iu = u >> 16;
  18.       int iv = ((v >> (16 - MAX_LOGY)) & MAX_MASKX) + textureRow;
  19.  
  20. #ifdef CALCULATE_PIXELDRAW
  21.       pixelDraw++;
  22.       if (*pBuffer)
  23.     pixelOverdraw++;
  24. #endif
  25.  
  26.       fill(texture.truecolor[multMuls[iv] + iu], w);
  27.       inc();
  28.     }
  29.   }
  30.   else if (textureType == SKY_TYPE) {
  31.     /* TODO: skies */
  32.     while (n--) {
  33.       int iu;
  34.       int iv;
  35.       struct rgb pel, sum;
  36.  
  37. #ifdef CALCULATE_PIXELDRAW
  38.       pixelDraw++;
  39.       if (*pBuffer)
  40.     pixelOverdraw++;
  41. #endif
  42.  
  43.       iu = ((u >> 8) + skyMovementX1) & 0x00007F00;
  44.       iv = ((v >> 16) + skyMovementY1) & 0x0000007F;
  45.       sum = texture.truecolor[iu + iv + 0x80];
  46.       iu = ((u >> 8) + skyMovementX2) & 0x00007F00;
  47.       iv = ((v >> 16) + skyMovementY2) & 0x0000007F;
  48.       pel = texture.truecolor[iu + iv];
  49.       if ((!pel.r) && (!pel.g) && (!pel.b))
  50.     sum = pel;
  51.  
  52.       fill(sum, 0xFFFF);
  53.       inc();
  54.     }
  55.   }
  56.   else {
  57.     while (n--) {
  58. #ifndef    FAST_WARP
  59.       int iv = ((v + (swim_v[((u >> textureShift2) & 0xff)] >> textureMip)) >> 16) & textureMask2;
  60.       int iu = ((u + (swim_u[((v >> textureShift2) & 0xff)] >> textureMip)) >> textureShift1) & textureMask1;
  61. #else
  62.       int iv = ((v + swim_v[(u >> 16)]) >> 16) & textureMask2;
  63.       int iu = ((u + swim_u[(v >> 16)]) >> textureShift1) & textureMask1;
  64. #endif
  65.  
  66.       fill(texture.truecolor[iu + iv], w);
  67.       inc();
  68.     }
  69.   }
  70.   return pBuffer;
  71. }
  72.  
  73. /* given a span (x0,y)..(x1,y), draw a perspective-correct span for it */
  74. /*
  75.  * the zbuffer is interesting for dynamic model-draw etc.
  76.  * the buffers values (1/z) are all under 0, we can try to
  77.  * store them as 16bit-wide-fraction
  78.  *
  79.  * while(n--) {
  80.  *   *zbuf++ = (unsigned short int)(w); / we need only the lower part /
  81.  *   w += dw;
  82.  * }
  83.  *
  84.  */
  85. void draw_spans24(int y, int ey)
  86. {
  87.   float prew = tmap[6] + y * tmap[8];
  88.   float prev = tmap[3] + y * tmap[5];
  89.   float preu = tmap[0] + y * tmap[2];
  90.  
  91.   for (; y < ey; y++) {
  92.     int sx = scan[y][0];
  93.     int len = scan[y][1] - sx;
  94.  
  95.     if (len > 0) {
  96.       float w0;
  97.       float v0;
  98.       float u0;
  99.  
  100. #ifdef    USE_ZBUFFER
  101.       int w, dw;                        /* 1/zbuffer */
  102. #endif
  103.       int v, dv;
  104.       int u, du;
  105.       int slen;
  106.  
  107.       struct rgb *pBuffer = (struct rgb *)localDim.frameBuffer + multRows[y] + sx;
  108.  
  109. #ifdef    USE_ZBUFFER
  110.       unsigned short int *zBuffer = localDim.zBuffer + multRows[y] + sx;
  111. #endif
  112.  
  113.       /* compute (u,v) at left end */
  114.       w0 = 1 / (prew + sx * tmap[7]);                /* 1/zbuffer */
  115.       v0 = (prev + sx * tmap[4]) * w0;
  116.       u0 = (preu + sx * tmap[1]) * w0;
  117.  
  118. #ifdef    USE_ZBUFFER
  119.       w = FLOAT_TO_FIX(w0);                    /* 1/zbuffer */
  120. #endif
  121.       v = FLOAT_TO_FIX(v0);
  122.       u = FLOAT_TO_FIX(u0);
  123.  
  124.       for (slen = len >> SUBDIV_SHIFT; slen > 0; slen--) {
  125.     sx += SUBDIV;
  126.     w0 = 1 / (prew + sx * tmap[7]);
  127.     v0 = (prev + sx * tmap[4]) * w0;
  128.     u0 = (preu + sx * tmap[1]) * w0;
  129.  
  130. #ifdef    USE_ZBUFFER
  131.     dw = (FLOAT_TO_FIX(w0) - w) >> SUBDIV_SHIFT;        /* 1/zbuffer */
  132. #endif
  133.     dv = (FLOAT_TO_FIX(v0) - v) >> SUBDIV_SHIFT;
  134.     du = (FLOAT_TO_FIX(u0) - u) >> SUBDIV_SHIFT;
  135.  
  136. #ifdef    USE_ZBUFFER
  137.     pBuffer = draw_affine24(SUBDIV, pBuffer, zBuffer, u, v, w, du, dv, dw);
  138.     zBuffer += SUBDIV;
  139. #else
  140.     pBuffer = draw_affine24(SUBDIV, pBuffer, u, v, du, dv);
  141. #endif
  142.  
  143. #ifdef    USE_ZBUFFER
  144.     w = FLOAT_TO_FIX(w0);                    /* 1/zbuffer */
  145. #endif
  146.     v = FLOAT_TO_FIX(v0);
  147.     u = FLOAT_TO_FIX(u0);
  148.       }
  149.  
  150.       if ((slen = (len & SUBDIV_MASK) - 1)) {            /* a) do not calc if only draw 1 pixel */
  151.     float w1;
  152.     float v1;
  153.     float u1;
  154.  
  155.     sx += slen;
  156.     w1 = 1 / (prew + sx * tmap[7]);
  157.     v1 = (prev + sx * tmap[4]) * w1;
  158.     u1 = (preu + sx * tmap[1]) * w1;
  159.  
  160. #ifdef    USE_ZBUFFER
  161.     dw = FLOAT_TO_FIX((w1 - w0) / slen);            /* 1/zbuffer */
  162. #endif
  163.     dv = FLOAT_TO_FIX((v1 - v0) / slen);
  164.     du = FLOAT_TO_FIX((u1 - u0) / slen);
  165.       }
  166.       /* a) but draw that pixel surely */
  167. #ifdef    USE_ZBUFFER
  168.       draw_affine24(slen + 1, pBuffer, zBuffer, u, v, w, du, dv, dw);    /* for the last pixel the du and dv are thrown away */
  169. #else
  170.       draw_affine24(slen + 1, pBuffer, u, v, du, dv);        /* for the last pixel the du and dv are thrown away */
  171. #endif
  172.     }
  173.  
  174.     prew += tmap[8];
  175.     prev += tmap[5];
  176.     preu += tmap[2];
  177.   }
  178. }
  179.